movq (reg),reg;
ALIGN
+/* %rbx: struct exec_domain */
restore_all_guest:
btr $_TF_failsafe_return,EDOMAIN_thread_flags(%rbx)
jc failsafe_callback
1: sysretl
ALIGN
+/* No special register assumptions. */
iret_exit_to_guest:
addq $8,%rsp
FLT1: iretq
+
.section .fixup,"ax"
FIX1: popq -15*8-8(%rsp) # error_code/entry_vector
SAVE_ALL # 15*8 bytes pushed
RESTORE_ALL
addq $8,%rsp
FLT2: iret
+
.section .fixup,"ax"
FIX2: pushq %rbx
GET_CURRENT(%rbx)
.previous
ALIGN
+/* No special register assumptions. */
restore_all_xen:
RESTORE_ALL
addq $8,%rsp
pushq restore_all_guest(%rip)
jmp create_bounce_frame
+/* %rbx: struct exec_domain */
hypercall:
sti
movq %r10,%rcx
callq *(%r10,%rax,8)
movq %rax,XREGS_rax(%rsp) # save the return value
+/* %rbx: struct exec_domain */
test_all_events:
cli # tests must not race interrupts
/*test_softirqs:*/
jmp restore_all_guest
ALIGN
+/* %rbx: struct exec_domain */
process_softirqs:
sti
call SYMBOL_NAME(do_softirq)
/* CREATE A BASIC EXCEPTION FRAME ON GUEST OS STACK: */
/* { RCX, R11, [DS-GS,] [CR2,] [ERRCODE,] RIP, CS, RFLAGS, RSP, SS } */
-/* %rdx == trap_bounce, %rbx == task_struct */
-/* %rax,%rcx are clobbered. %rsi contains new XREGS_rsp. */
+/* %rdx: trap_bounce, %rbx: struct exec_domain */
+/* On return only %rbx is guaranteed non-clobbered. */
create_bounce_frame:
/* Push new frame at existing %rsp if already in guest-OS mode. */
movq XREGS_rsp+8(%rsp),%rsi
FLT15: movq %rax,(%rsi) # RCX
/* Rewrite our stack frame and return to guest-OS mode. */
/* IA32 Ref. Vol. 3: TF, VM, RF and NT flags are cleared on trap. */
- movb $0,TRAPBOUNCE_flags(%rdx)
- bts $_TF_kernel_mode,EDOMAIN_thread_flags(%rbx)
- jc 1f
- swapgs
- movq %rbx,%rdi
- call SYMBOL_NAME(write_ptbase)
-1: movl $TRAP_syscall,XREGS_entry_vector+8(%rsp)
+ movl $TRAP_syscall,XREGS_entry_vector+8(%rsp)
andl $0xfffcbeff,XREGS_eflags+8(%rsp)
movl $__GUEST_SS,XREGS_ss+8(%rsp)
movq %rsi,XREGS_rsp+8(%rsp)
movl $__GUEST_CS,XREGS_cs+8(%rsp)
movq TRAPBOUNCE_eip(%rdx),%rax
movq %rax,XREGS_rip+8(%rsp)
+ movb $0,TRAPBOUNCE_flags(%rdx)
+ testb $TF_kernel_mode,EDOMAIN_thread_flags(%rbx)
+ jz SYMBOL_NAME(toggle_guest_mode)
ret
.section .fixup,"ax"
FIX3: sti
.previous
ALIGN
+/* %rbx: struct exec_domain */
process_guest_exception_and_events:
leaq EDOMAIN_trap_bounce(%rbx),%rdx
testb $TBF_EXCEPTION,TRAPBOUNCE_flags(%rdx)
jmp test_all_events
ALIGN
+/* No special register assumptions. */
ENTRY(ret_from_intr)
GET_CURRENT(%rbx)
testb $3,XREGS_cs(%rsp)
jmp restore_all_xen
ALIGN
+/* No special register assumptions. */
error_code:
SAVE_ALL
testb $X86_EFLAGS_IF>>8,XREGS_eflags+1(%rsp)
jz restore_all_xen
jmp process_guest_exception_and_events
+/* No special register assumptions. */
exception_with_ints_disabled:
testb $3,XREGS_cs(%rsp) # interrupts disabled outside Xen?
jnz 1b # it really does happen!
movq %rax,XREGS_kernel_sizeof(%rsp)
jmp restore_all_xen # return to fixup code
+/* No special register assumptions. */
FATAL_exception_with_ints_disabled:
movl XREGS_entry_vector(%rsp),%edi
movq %rsp,%rsi
if ( unlikely(smfn == 0) )
smfn = shadow_l2_table(d, gpfn);
#ifdef CONFIG_VMX
- else
- if (shadow_mode_translate(ed->domain) )
- {
- vmx_update_shadow_state(ed, gpfn, smfn);
- }
+ else if ( shadow_mode_translate(ed->domain) )
+ vmx_update_shadow_state(ed, gpfn, smfn);
#endif
ed->arch.shadow_table = mk_pagetable(smfn<<PAGE_SHIFT);
{
if ( unlikely(shadow_mode_enabled(ed->domain)) )
{
- SH_VVLOG("update_pagetables( gptbase=%p, mode=%d )",
- pagetable_val(ed->arch.guest_table),
- shadow_mode(ed->domain));
-
shadow_lock(ed->domain);
__update_pagetables(ed);
shadow_unlock(ed->domain);
-
- SH_VVLOG("leaving update_pagetables:\n"
- "( gptbase=%p, mode=%d ) sh=%p",
- pagetable_val(ed->arch.guest_table),
- shadow_mode(ed->domain),
- pagetable_val(ed->arch.shadow_table) );
}
- else
#ifdef __x86_64__
- if ( !(ed->arch.flags & TF_kernel_mode) )
- ed->arch.monitor_table = ed->arch.guest_table_user;
- else
+ else if ( !(ed->arch.flags & TF_kernel_mode) )
+ ed->arch.monitor_table = ed->arch.guest_table_user;
#endif
- ed->arch.monitor_table = ed->arch.guest_table;
-
+ else
+ ed->arch.monitor_table = ed->arch.guest_table;
}
#if SHADOW_DEBUG